1   /*                        __    __  __  __    __  ___
2    *                       \  \  /  /    \  \  /  /  __/
3    *                        \  \/  /  /\  \  \/  /  /
4    *                         \____/__/  \__\____/__/.ɪᴏ
5    * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ
6    */
7   package io.vavr.collection;
8   
9   import io.vavr.Value;
10  import org.junit.Ignore;
11  import org.junit.Test;
12  
13  import java.math.BigDecimal;
14  import java.util.ArrayList;
15  import java.util.Comparator;
16  import java.util.function.Function;
17  import java.util.function.Supplier;
18  import java.util.stream.Collector;
19  
20  import static java.util.Comparator.nullsFirst;
21  import static io.vavr.TestComparators.toStringComparator;
22  
23  public class TreeSetTest extends AbstractSortedSetTest {
24  
25      @Override
26      protected <T> Collector<T, ArrayList<T>, ? extends TreeSet<T>> collector() {
27          return TreeSet.collector(Comparators.naturalComparator());
28      }
29  
30      @Override
31      protected <T> TreeSet<T> empty() {
32          return TreeSet.empty(Comparators.naturalComparator());
33      }
34  
35      @Override
36      protected <T> TreeSet<T> emptyWithNull() {
37          return TreeSet.empty(nullsFirst(Comparators.naturalComparator()));
38      }
39  
40      @Override
41      protected boolean emptyShouldBeSingleton() {
42          return false;
43      }
44  
45      @Override
46      protected <T> TreeSet<T> of(T element) {
47          return TreeSet.of(Comparators.naturalComparator(), element);
48      }
49  
50      @Override
51      protected <T> TreeSet<T> of(Comparator<? super T> comparator, T element) {
52          return TreeSet.of(comparator, element);
53      }
54  
55      @Override
56      @SafeVarargs
57      @SuppressWarnings("varargs")
58      protected final <T> TreeSet<T> of(Comparator<? super T> comparator, T... elements) {
59          return TreeSet.of(comparator, elements);
60      }
61  
62      @Override
63      @SafeVarargs
64      @SuppressWarnings("varargs")
65      protected final <T> TreeSet<T> of(T... elements) {
66          return TreeSet.<T> of(Comparators.naturalComparator(), elements);
67      }
68  
69      @Override
70      protected <T> TreeSet<T> ofAll(Iterable<? extends T> elements) {
71          return TreeSet.ofAll(Comparators.naturalComparator(), elements);
72      }
73  
74      @Override
75      protected <T extends Comparable<? super T>> TreeSet<T> ofJavaStream(java.util.stream.Stream<? extends T> javaStream) {
76          return TreeSet.ofAll(javaStream);
77      }
78  
79      @Override
80      protected TreeSet<Boolean> ofAll(boolean... elements) {
81          return TreeSet.ofAll(elements);
82      }
83  
84      @Override
85      protected TreeSet<Byte> ofAll(byte... elements) {
86          return TreeSet.ofAll(elements);
87      }
88  
89      @Override
90      protected TreeSet<Character> ofAll(char... elements) {
91          return TreeSet.ofAll(elements);
92      }
93  
94      @Override
95      protected TreeSet<Double> ofAll(double... elements) {
96          return TreeSet.ofAll(elements);
97      }
98  
99      @Override
100     protected TreeSet<Float> ofAll(float... elements) {
101         return TreeSet.ofAll(elements);
102     }
103 
104     @Override
105     protected TreeSet<Integer> ofAll(int... elements) {
106         return TreeSet.ofAll(elements);
107     }
108 
109     @Override
110     protected TreeSet<Long> ofAll(long... elements) {
111         return TreeSet.ofAll(elements);
112     }
113 
114     @Override
115     protected TreeSet<Short> ofAll(short... elements) {
116         return TreeSet.ofAll(elements);
117     }
118 
119     @Override
120     protected <T> TreeSet<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
121         return TreeSet.tabulate(Comparators.naturalComparator(), n, f);
122     }
123 
124     @Override
125     protected <T> TreeSet<T> fill(int n, Supplier<? extends T> s) {
126         return TreeSet.fill(Comparators.naturalComparator(), n, s);
127     }
128 
129     @Override
130     protected boolean useIsEqualToInsteadOfIsSameAs() {
131         return true;
132     }
133 
134     @Override
135     protected int getPeekNonNilPerformingAnAction() {
136         return 1;
137     }
138 
139     @Override
140     protected TreeSet<Character> range(char from, char toExclusive) {
141         return TreeSet.range(from, toExclusive);
142     }
143 
144     @Override
145     protected TreeSet<Character> rangeBy(char from, char toExclusive, int step) {
146         return TreeSet.rangeBy(from, toExclusive, step);
147     }
148 
149     @Override
150     protected TreeSet<Double> rangeBy(double from, double toExclusive, double step) {
151         return TreeSet.rangeBy(from, toExclusive, step);
152     }
153 
154     @Override
155     protected TreeSet<Integer> range(int from, int toExclusive) {
156         return TreeSet.range(from, toExclusive);
157     }
158 
159     @Override
160     protected TreeSet<Integer> rangeBy(int from, int toExclusive, int step) {
161         return TreeSet.rangeBy(from, toExclusive, step);
162     }
163 
164     @Override
165     protected TreeSet<Long> range(long from, long toExclusive) {
166         return TreeSet.range(from, toExclusive);
167     }
168 
169     @Override
170     protected TreeSet<Long> rangeBy(long from, long toExclusive, long step) {
171         return TreeSet.rangeBy(from, toExclusive, step);
172     }
173 
174     @Override
175     protected TreeSet<Character> rangeClosed(char from, char toInclusive) {
176         return TreeSet.rangeClosed(from, toInclusive);
177     }
178 
179     @Override
180     protected TreeSet<Character> rangeClosedBy(char from, char toInclusive, int step) {
181         return TreeSet.rangeClosedBy(from, toInclusive, step);
182     }
183 
184     @Override
185     protected TreeSet<Double> rangeClosedBy(double from, double toInclusive, double step) {
186         return TreeSet.rangeClosedBy(from, toInclusive, step);
187     }
188 
189     @Override
190     protected TreeSet<Integer> rangeClosed(int from, int toInclusive) {
191         return TreeSet.rangeClosed(from, toInclusive);
192     }
193 
194     @Override
195     protected TreeSet<Integer> rangeClosedBy(int from, int toInclusive, int step) {
196         return TreeSet.rangeClosedBy(from, toInclusive, step);
197     }
198 
199     @Override
200     protected TreeSet<Long> rangeClosed(long from, long toInclusive) {
201         return TreeSet.rangeClosed(from, toInclusive);
202     }
203 
204     @Override
205     protected TreeSet<Long> rangeClosedBy(long from, long toInclusive, long step) {
206         return TreeSet.rangeClosedBy(from, toInclusive, step);
207     }
208 
209     // -- collector
210 
211     @Test
212     public void shouldCollectEmpty() {
213         final TreeSet<Integer> actual = java.util.stream.Stream.<Integer>empty().collect(TreeSet.collector());
214         assertThat(actual).isEmpty();
215     }
216 
217     @Test
218     public void shouldCollectNonEmpty() {
219         final TreeSet<Integer> actual = java.util.stream.Stream.of(1, 2, 3).collect(TreeSet.collector());
220         final TreeSet<Integer> expected = of(1, 2, 3);
221         assertThat(actual).isEqualTo(expected);
222     }
223 
224     // -- construct
225 
226     @Test
227     public void shouldConstructStreamFromEmptyJavaStream() {
228         final TreeSet<Integer> actual = ofJavaStream(java.util.stream.Stream.<Integer>empty());
229         final TreeSet<Integer> expected = empty();
230         assertThat(actual).isEqualTo(expected);
231     }
232 
233     @Test
234     public void shouldConstructStreamFromNonEmptyJavaStream() {
235         final TreeSet<Integer> actual = TreeSet.ofAll(Comparators.naturalComparator(), java.util.stream.Stream.of(1, 2, 3));
236         final TreeSet<Integer> expected = of(1, 2, 3);
237         assertThat(actual).isEqualTo(expected);
238     }
239 
240     @Test
241     public void shouldConstructStreamFromNonEmptyJavaStreamWithoutComparator() {
242         final TreeSet<Integer> actual = ofJavaStream(java.util.stream.Stream.of(1, 2, 3));
243         final TreeSet<Integer> expected = of(1, 2, 3);
244         assertThat(actual).isEqualTo(expected);
245     }
246 
247     @Test
248     public void shouldConstructFromTreeSetWithoutComparator() {
249         final TreeSet<Integer> actual = TreeSet.ofAll(TreeSet.of(1));
250         final TreeSet<Integer> expected = of(1);
251         assertThat(actual).isEqualTo(expected);
252     }
253 
254     // -- static narrow
255 
256     @Test
257     public void shouldNarrowTreeSet() {
258         final TreeSet<Double> doubles = TreeSet.of(toStringComparator(), 1.0d);
259         final TreeSet<Number> numbers = TreeSet.narrow(doubles);
260         final int actual = numbers.add(new BigDecimal("2.0")).sum().intValue();
261         assertThat(actual).isEqualTo(3);
262     }
263 
264     // -- addAll
265 
266     @Test
267     public void shouldKeepComparator() {
268         final List<Integer> actual = TreeSet.empty(inverseIntComparator()).addAll(TreeSet.of(1, 2, 3)).toList();
269         final List<Integer> expected = List.of(3, 2, 1);
270         assertThat(actual).isEqualTo(expected);
271     }
272 
273     // -- diff
274 
275     @Test
276     public void shouldCalculateDiffIfNotTreeSet() {
277         final TreeSet<Integer> actual = of(1, 2, 3).diff(HashSet.of(1, 2));
278         final TreeSet<Integer> expected = of(3);
279         assertThat(actual).isEqualTo(expected);
280     }
281 
282     // -- union
283 
284     @Test
285     public void shouldCalculateUnionIfNotTreeSet() {
286         final TreeSet<Integer> actual = of(1, 2, 3).union(HashSet.of(4));
287         final TreeSet<Integer> expected = of(1, 2, 3, 4);
288         assertThat(actual).isEqualTo(expected);
289     }
290 
291     // -- intersect
292 
293     @Test
294     public void shouldCalculateEmptyIntersectIfNotTreeSet() {
295         final TreeSet<Integer> actual = of(1, 2, 3).intersect(HashSet.of(4));
296         assertThat(actual).isEmpty();
297     }
298 
299     @Test
300     public void shouldCalculateIntersectIfNotTreeSet() {
301         final TreeSet<Integer> actual = of(1, 2, 3).intersect(HashSet.of(3));
302         final TreeSet<Integer> expected = of(3);
303         assertThat(actual).isEqualTo(expected);
304     }
305 
306     // -- fill
307 
308     @Test
309     public void shouldFillWithoutComparator() {
310         final TreeSet<Integer> actual = TreeSet.fill(3, () -> 1);
311         final TreeSet<Integer> expected = of(1, 1, 1);
312         assertThat(actual).isEqualTo(expected);
313     }
314 
315     // -- tabulate
316 
317     @Test
318     public void shouldTabulateWithoutComparator() {
319         final TreeSet<Integer> actual = TreeSet.tabulate(3, Function.identity());
320         final TreeSet<Integer> expected = of(0, 1, 2);
321         assertThat(actual).isEqualTo(expected);
322     }
323 
324     // -- toSortedSet
325 
326     @Test
327     public void shouldReturnSelfOnConvertToSortedSet() {
328         final Value<Integer> value = of(1, 2, 3);
329         assertThat(value.toSortedSet()).isSameAs(value);
330     }
331 
332     @Test
333     public void shouldReturnSelfOnConvertToSortedSetWithSameComparator() {
334         final TreeSet<Integer> value = of(1, 2, 3);
335         assertThat(value.toSortedSet(value.comparator())).isSameAs(value);
336     }
337 
338     @Test
339     public void shouldNotReturnSelfOnConvertToSortedSetWithDifferentComparator() {
340         final Value<Integer> value = of(1, 2, 3);
341         assertThat(value.toSortedSet(Integer::compareTo)).isNotSameAs(value);
342     }
343 
344     @Test
345     public void shouldPreserveComparatorOnConvertToSortedSetWithoutDistinctComparator() {
346         final Value<Integer> value = TreeSet.of(Comparators.naturalComparator().reversed(), 1, 2, 3);
347         assertThat(value.toSortedSet().mkString(",")).isEqualTo("3,2,1");
348     }
349 
350     // -- transform()
351 
352     @Test
353     public void shouldTransform() {
354         final String transformed = of(42).transform(v -> String.valueOf(v.get()));
355         assertThat(transformed).isEqualTo("42");
356     }
357 
358     // -- helpers
359 
360     private static Comparator<Integer> inverseIntComparator() {
361         return (i1, i2) -> Integer.compare(i2, i1);
362     }
363 
364     @Override
365     @Test
366     @Ignore
367     public void shouldZipAllEmptyAndNonNil() {
368     }
369 
370     @Override
371     @Test
372     @Ignore
373     public void shouldZipAllNonEmptyAndNil() {
374     }
375 }